unit DataRecord;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB;

type

  { TDataRecord }

  /// Classe para armazenar registros de dados
  TDataRecord = class
  private
    /// Vetor com os campos do registro
    Fields: array of string;
    /// Vetor com os valores do registro
    Values: array of string;
  public
    /// Destrutor
    destructor Destroy();
    /// Adiciona um campo com seu valor
    /// @param(Field é o nome do campo)
    /// @param(Value é o valor do campo)
    procedure addValue(Field: string; Value: string);
    /// Lê os dados do registro atual de um DataSet
    /// @param(DataSet é o DataSet do qual os dados serão lidos)
    procedure ReadFromDataSet(DataSet: TDataSet);
    /// Obtém o valor de um campo
    /// @param(Field é o nome do campo)
    /// @return(Retrona o valor do campo solicitado)
    function getValue(Field: string): String;
    /// Obtém o valor de um campo na forma de string
    /// @param(Field é o nome do campo)
    /// @return(Retorna o valor do campo solicitado em formato String)
    //function getStringValue(Field: string): string;
    /// Grava os dados do DataRecord em um DataSet
    /// @param(DataSet é o DataSet no qual os dados serão gravados)
    procedure WriteToDataSet(DataSet: TDataSet);
  end;

implementation

uses
  Dialogs;

{ TDataRecord }

destructor TDataRecord.Destroy;
begin
  // Inicializa os vetores com zero posições
  SetLength(Fields, 0);
  SetLength(Values, 0);
end;

procedure TDataRecord.addValue(Field: string; Value: String);
begin
  // Aumenta o tamanho dos vetores em 1
  SetLength(Fields, Length(Fields) + 1);
  SetLength(Values, Length(Values) + 1);
  // Acrescenta o nome do campo e o valor nas posições finais dos vetores
  // O nome do campo é passado para minúsculas para futuras comparações
  Fields[Length(Fields) - 1] := AnsiLowerCase(Field);
  Values[Length(Values) - 1] := Value;
  //Alteração do Value para StringValue
  //!ShowMessage(IntToStr(Length(Fields))+' ' +Field+' '+ IntToStr(Length(Values)));
end;

procedure TDataRecord.ReadFromDataSet(DataSet: TDataSet);
var
  i: integer;
begin
  //!Verificar campo criado no zquery que nao existe no select
  // Verifica se o DataSet é válido, está ativo e possui registros
  if (DataSet <> nil) and (DataSet.Active) and (DataSet.RecordCount > 0) then begin
    // Percorre todos os campos do DataSet
    //!ShowMessage(IntToStr(DataSet.FieldCount));
    for i := 0 to DataSet.FieldCount - 1 do begin
      // Acrescenta os campos com seus valores ao DataRecord
      addValue(DataSet.Fields[i].FieldName, DataSet.Fields[i].AsString);
    end;
  end;
end;

function TDataRecord.getValue(Field: string): String;
var
  i: integer;
begin
  // Inicialmente o resultado é nil, pois o campo pode não ser encontrado
  Result := '';
  // Percorre o vetor de campos
  for i := 0 to Length(Fields) - 1 do begin
    // Testa se u campo atual do vetor é o desejado
    if Fields[i] = AnsiLowerCase(Field) then begin
      // Se for pega o valor do campo como resultado
      Result := Values[i];
    end;
  end;
end;
                      {
function TDataRecord.getStringValue(field: string): string;
var
  i: integer;
begin
  // Inicialmente o resultado é vazio, pois o campo pode não ser encontrado
  Result := '';
  // Percorre o vetor de campos
  for i := 0 to Length(Fields) - 1 do begin
    // Testa se u campo atual do vetor é o desejado
    if Fields[i] = AnsiLowerCase(Field) then begin
      // Se for pega o valor do campo como resultado
      Result := Values[i];
    end;
  end;
end;
}

procedure TDataRecord.WriteToDataSet(DataSet: TDataSet);
var
  i: integer;
  Field: TField;
begin
  // Verifica se o DataSet é válido, está ativo e está em modo de escrita
  if (DataSet <> nil) and (DataSet.Active) and (DataSet.State in dsWriteModes) then begin
    // Percorre o vetor de campos
    for i := 0 to Length(Fields) - 1 do begin
      // Procura pelo campo atual no DataSet
      Field := Dataset.Fields.FindField(Fields[i]);
      // Se o campo for encontrado
      if (Field <> nil) then
        // Atribui o valor ao campo
        Field.AsString := Values[i];
    end;
  end;
end;


end.
